package pe.com.cotelasa.scp.dominio.modelo;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.inject.Inject;

import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_CONTACTO;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioArchivos;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioContacto;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.entidad.Contacto;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.TipoContacto;

@Component("empresaModel")
public class EmpresaModelImpl implements EmpresaModel {

    private static final Integer SEDE_ADMINISTRADORA = 1;
    @Inject
    private IServicioEmpresa servicioEmpresa;
    @Inject
    private IServicioContacto servicioContacto;
    @Inject
    private IServicioSede servicioSede;
    @Autowired
    @Qualifier("serviceProperties")
    protected Properties serviceProperties;

    public EmpresaModelImpl() {
    }

    @Override
    public Collection<Empresa> buscarListaEmpresa(Empresa objEmpresa)
            throws ModelExcepcion {
        try {
            return this.servicioEmpresa.listarServiciosPorFiltro(objEmpresa);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public Empresa obtenerEmpresaPorId(Integer id) throws ModelExcepcion {
        try {
            return this.servicioEmpresa.conseguirEmpresaPorId(id);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public void actualizarEmpresa(Empresa objEmpresa, Sede sedeAdmnin, List<Contacto> listaContacto,
            UploadedFile fileLogo, UploadedFile fileLogoDoc) throws ModelExcepcion {
        try {

            /*TipoContacto tipContacto = new TipoContacto();
             tipContacto.setId(TIPO_CONTACTO.REPRESENTANTE.getValor());*/

            /*Sede sedeAdministrativa = new Sede();
             sedeAdministrativa.setIdEmpresa(objEmpresa);
		        
             sedeAdministrativa = servicioSede.buscarSedeAdministradora(sedeAdministrativa);*/
            for (Contacto contacto : listaContacto) {
                if (contacto.getId() == null) {
                    contacto.setIdSede(sedeAdmnin);
                }
                //contacto.setIdTipoContacto(tipContacto);
            }
            sedeAdmnin.setContactoCollection(listaContacto);
            objEmpresa.setSedeCollection(new ArrayList<Sede>());
            objEmpresa.getSedeCollection().add(sedeAdmnin);
            servicioEmpresa.actualizarEmpresa(objEmpresa);
            if (fileLogo != null) {
                guardarLogoServer(fileLogo, serviceProperties.getProperty("path.server.logo") + objEmpresa.getLogo());
            }
            if (fileLogoDoc != null) {
                guardarLogoServer(fileLogoDoc, serviceProperties.getProperty("path.server.logo") + objEmpresa.getLogoDoc());
            }

        } catch (Exception e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public List<Contacto> buscarRepresentantes(Empresa objEmpresa)
            throws ModelExcepcion {
        try {
            return (List<Contacto>) servicioContacto.buscarRepresentantePorEmpresa(objEmpresa);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public void guardarEmpresa(Empresa objEmpresa, List<Contacto> listaContacto, UploadedFile fileLogo, UploadedFile fileLogoDoc) throws ModelExcepcion {
        try {
            if (!validarRuc(objEmpresa.getRuc())) {
                throw new ModelExcepcion(Constantes.CodigoErrorEmpresa.CODIGO_ERROR_RUC);
            } else if (!validarRazonSocial(objEmpresa.getRazonSocial())) {
                throw new ModelExcepcion(Constantes.CodigoErrorEmpresa.CODIGO_ERROR_RAZON_SOCIAL);
            } else {

                Sede sedeAdministradora = cargarSedeAdministradora(objEmpresa);

                //TipoContacto tipContacto = new TipoContacto();
                //tipContacto.setId(TIPO_CONTACTO.REPRESENTANTE.getValor());
                for (Contacto contacto : listaContacto) {
                    //contacto.setIdTipoContacto(tipContacto);
                    contacto.setIdSede(sedeAdministradora);
                }

                sedeAdministradora.setContactoCollection(listaContacto);
                objEmpresa.getSedeCollection().add(sedeAdministradora);
                servicioEmpresa.guardarEmpresa(objEmpresa);
                if (fileLogo != null) {
                    guardarLogoServer(fileLogo, serviceProperties.getProperty("path.server.logo") + objEmpresa.getLogo());
                }
                if (fileLogoDoc != null) {
                    guardarLogoServer(fileLogoDoc, serviceProperties.getProperty("path.server.logo") + objEmpresa.getLogoDoc());
                }

            }
        } catch (ServiceException e) {
            throw new ModelExcepcion("", e.getMessage(), e);
        }
    }

    @Override
    public void eliminarEmpresa(Empresa objEmpresa, String usuario) throws ModelExcepcion {
        try {
            objEmpresa = servicioEmpresa.conseguirEmpresaPorId(objEmpresa.getId());
            objEmpresa.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            objEmpresa.setUsrModificacion(usuario);
            objEmpresa.setFecModificacion(new Date());
            for (Sede sede : objEmpresa.getSedeCollection()) {
                sede.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
                sede.setUsrModificacion(usuario);
                sede.setFecModificacion(new Date());
                for (Contacto contacto : sede.getContactoCollection()) {
                    contacto.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
                    contacto.setUsrModificacion(objEmpresa.getUsrModificacion());
                    contacto.setFecModficacion(new Date());
                }
            }
            servicioEmpresa.actualizarEmpresa(objEmpresa);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public List<Contacto> obtenerListaRepresentantes(Empresa objEmpresa) throws ModelExcepcion {
        List<Contacto> listaContacto;
        try {
            listaContacto = (List<Contacto>) servicioContacto.buscarRepresentantePorEmpresa(objEmpresa);
            return listaContacto;
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    private Sede cargarSedeAdministradora(Empresa objEmpresa) {
        Sede sedeAdministradora = new Sede();
        sedeAdministradora.setNombre(objEmpresa.getRazonSocial());
        sedeAdministradora.setDescripcion(objEmpresa.getNombreComercial());
        sedeAdministradora.setIdUbigeo(objEmpresa.getIdUbigeo());
        sedeAdministradora.setSedeAdministradora(SEDE_ADMINISTRADORA);
        sedeAdministradora.setDireccion(objEmpresa.getDireccionLegal());
        sedeAdministradora.setReferencia("");
        sedeAdministradora.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
        sedeAdministradora.setEsTienda((short) 0);
        sedeAdministradora.setEsAlmacen((short) 0);
        sedeAdministradora.setDescUbicacion(objEmpresa.getDescUbicacion());
        sedeAdministradora.setUsrCreacion(objEmpresa.getUsrCreacion());
        sedeAdministradora.setFecCreacion(new Date());
        sedeAdministradora.setIdEmpresa(objEmpresa);
        sedeAdministradora.setNroSecGuiaRemision(new Integer(0));
        sedeAdministradora.setNroSecFactura(new Integer(0));
        sedeAdministradora.setNroSerieFactura("000");
        sedeAdministradora.setNroSerieGuiaRemision("000");
        return sedeAdministradora;
    }

    private boolean validarRuc(String ruc) throws ServiceException {
        try {
            return servicioEmpresa.validarRuc(ruc);
        } catch (ServiceException e) {
            return false;
        }

    }

    private boolean validarRazonSocial(String razonSocial) {
        try {
            return servicioEmpresa.validarRazonSocial(razonSocial);
        } catch (ServiceException e) {
            return false;
        }

    }

    private boolean guardarLogoServer(UploadedFile fileLogo, String logo) throws ServiceException {
        try {
            File archivoLogo = new File(logo);
            if (archivoLogo != null) {
                if (archivoLogo.exists()) {
                    UtilitarioArchivos.delete(archivoLogo);
                }
            }
            System.out.println("Logo " + logo);
            System.out.println("Archivo Logo " + archivoLogo);
            System.out.println("FileLogo " + fileLogo);
            System.out.println("Flujo " + fileLogo.getInputstream());
            UtilitarioArchivos.copyInputStream(fileLogo.getInputstream(), archivoLogo);
            return true;
        } catch (IOException e) {
            throw new ServiceException(e);
        }

    }
}
